
#include <iostream>
#include <vector>
#include <memory>
#include <string>

// Step 1: 定义组件接口 (Component)
class FileSystemItem {
public:
    virtual ~FileSystemItem() = default;

    // 统一接口，用于显示信息
    virtual void display(int depth = 0) const = 0;
};

// Step 2: 定义叶子节点 (Leaf)
class File : public FileSystemItem {
public:
    explicit File(const std::string& name) : name_(name) {}

    // 叶子节点的 display 方法
    void display(int depth = 0) const override {
        std::cout << std::string(depth * 2, ' ') << "- File: " << name_ << std::endl;
    }

private:
    std::string name_;  // 文件名
};

// Step 3: 定义组合节点 (Composite)
class Folder : public FileSystemItem {
public:
    explicit Folder(const std::string& name) : name_(name) {}

    // 添加子节点
    void add(std::shared_ptr<FileSystemItem> item) {
        children_.push_back(item);
    }

    // 移除子节点
    void remove(const std::shared_ptr<FileSystemItem>& item) {
        children_.erase(std::remove(children_.begin(), children_.end(), item), children_.end());
    }

    // 组合节点的 display 方法
    void display(int depth = 0) const override {
        std::cout << std::string(depth * 2, ' ') << "+ Folder: " << name_ << std::endl;
        for (const auto& child : children_) {
            child->display(depth + 1);  // 递归调用子节点的 display 方法
        }
    }

private:
    std::string name_;  // 文件夹名
    std::vector<std::shared_ptr<FileSystemItem>> children_;  // 子节点列表
};

// Step 4: 客户端代码
int main() {
    // 创建文件
    auto file1 = std::make_shared<File>("file1.txt");
    auto file2 = std::make_shared<File>("file2.txt");
    auto file3 = std::make_shared<File>("file3.txt");

    // 创建文件夹
    auto folder1 = std::make_shared<Folder>("Folder1");
    auto folder2 = std::make_shared<Folder>("Folder2");
    auto root = std::make_shared<Folder>("Root");

    // 组织文件系统
    folder1->add(file1);
    folder1->add(file2);
    folder2->add(file3);
    root->add(folder1);
    root->add(folder2);

    // 显示文件系统结构
    root->display();

    return 0;
}


